<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    // apply():使用 apply 方法调用函数，同时指定被调用函数中 this 的值
    // 语法：fun.apply(thisArg（不能省）, [argsArray])     fun.apply(this指向谁, 数组参数)
    // thisArg:在 fun 函数运行时指定的 this 值
    // argsArray：传递的值，必须包含在【数组】里面
    // 返回值就是函数的返回值，因为它就是调用函数
    // 因此 apply 主要跟数组有关系，比如使用 Math.max() 求数组的最大值

    // apply 与 call 区别：
    // 都是调用函数，都能改变 this 指向
    // 参数不一样，apply 传递的必须是数组

    const obj = {
      age: 18
    }
    function fn(x, y) {
      console.log(this)  // window
      console.log(x + y)  // 3
    }
    // 1.调用函数
    // 2.改变 this 指向
    fn.apply(obj, [1, 2])  // 指向 obj   {age: 18}
    // 3.返回值   返回值就是函数的返回值，因为它就是调用函数


    // 使用场景：求数组的最大值   fun.apply(this指向谁, 数组参数)
    console.log(Math.max(1, 2, 3, 4))  // 4

    const max = Math.max.apply(Math, [1, 2, 3, 4])
    console.log(max)  // 3

    const arr = [100, 25, 50]
    const maxarr = Math.max.apply(Math, arr)
    const minarr = Math.min.apply(null, arr)   // 第一个参数必须要写，哪怕写个null，就是不能省
    console.log(maxarr, minarr)
  </script>
</body>

</html>